// 作业提交模型
const { DataTypes } = require('sequelize');
const sequelize = require('../config/database');
const User = require('./User');
const Homework = require('./Homework');

/**
 * 作业提交模型
 * 存储学生提交的作业信息和评分
 */
const Submission = sequelize.define('Submission', {
  /**
   * 提交ID，主键，自增
   */
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true,
    autoIncrement: true,
    allowNull: false
  },
  /**
   * 作业ID
   */
  homeworkId: {
    type: DataTypes.INTEGER,
    allowNull: false,
    references: {
      model: Homework,
      key: 'id'
    },
    comment: '作业ID'
  },
  /**
   * 学生ID
   */
  studentId: {
    type: DataTypes.INTEGER,
    allowNull: false,
    references: {
      model: User,
      key: 'id'
    },
    comment: '学生ID'
  },
  /**
   * 提交内容
   */
  content: {
    type: DataTypes.TEXT,
    allowNull: false,
    comment: '提交内容'
  },
  /**
   * 附件路径（图片等）
   */
  attachment: {
    type: DataTypes.STRING(255),
    allowNull: true,
    comment: '附件路径'
  },
  /**
   * 图片路径数组（JSON格式存储）
   */
  images: {
    type: DataTypes.STRING(255),
    allowNull: true,
    comment: '图片路径数组',
    // 存储图片路径数组的JSON字符串
    get() {
      const rawValue = this.getDataValue('images');
      return rawValue ? JSON.parse(rawValue) : [];
    },
    set(value) {
      if (Array.isArray(value)) {
        this.setDataValue('images', JSON.stringify(value));
      } else if (typeof value === 'string' && value) {
        // 处理从旧格式迁移的数据
        try {
          const parsed = JSON.parse(value);
          this.setDataValue('images', Array.isArray(parsed) ? JSON.stringify(parsed) : JSON.stringify([parsed]));
        } catch {
          this.setDataValue('images', JSON.stringify([]));
        }
      } else {
        this.setDataValue('images', JSON.stringify([]));
      }
    }
  },
  /**
   * 评分（0-5分）
   */
  score: {
    type: DataTypes.DECIMAL(3, 1),
    allowNull: true,
    validate: {
      min: 0,
      max: 5
    },
    comment: '评分（0-5分）'
  },
  /**
     * 评价文字
     */
    comment: {
      type: DataTypes.TEXT,
      allowNull: true,
      comment: '评价文字'
    },
  /**
   * 评分教师ID
   */
  gradedBy: {
    type: DataTypes.INTEGER,
    allowNull: true,
    references: {
      model: User,
      key: 'id'
    },
    comment: '评分教师ID'
  },
  /**
   * 提交时间
   */
  submittedAt: {
    type: DataTypes.DATE,
    allowNull: false,
    defaultValue: DataTypes.NOW
  },
  /**
   * 评分时间
   */
  gradedAt: {
    type: DataTypes.DATE,
    allowNull: true,
    comment: '评分时间'
  },
  /**
   * 是否为退回作业记录
   */
  isRejectedRecord: {
    type: DataTypes.BOOLEAN,
    allowNull: false,
    defaultValue: false,
    comment: '是否为退回作业记录'
  }
}, {
  tableName: 'submissions',
  timestamps: true
});

// 关联关系
Submission.belongsTo(Homework, { foreignKey: 'homeworkId', as: 'homework' });
Submission.belongsTo(User, { foreignKey: 'studentId', as: 'student' });
Submission.belongsTo(User, { foreignKey: 'gradedBy', as: 'grader' });
User.hasMany(Submission, { foreignKey: 'studentId', as: 'submissions' });
User.hasMany(Submission, { foreignKey: 'gradedBy', as: 'gradedSubmissions' });
Homework.hasMany(Submission, { foreignKey: 'homeworkId', as: 'submissions' });

module.exports = Submission;